﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LDSP.BRL;
using BYFW.DAL;

namespace TaskPlanEmailGenerator
{
    public class TaskPlanEmailGenerator
    {
        public void Run()
        {
            GenerateMail(new Plan().GetPlansByStatus((int)TaskStatus.未开始));
            GenerateMail(new Plan().GetPlansByStatus((int)TaskStatus.进行中));
        }

        private void GenerateMail(List<Plan> plans)
        {
            foreach (Plan plan in plans)
            {
                int config = plan.EnterpriseCodification.Enterprise.EnterpriseConfig.TaskPlanAlertDays;

                //当用户设置了到期未完成的邮件提醒
                if (config > 0)
                {
                    if (plan.ExpiredDT < DateTime.Now
                    && ((TimeSpan)(plan.ExpiredDT - DateTime.Now)).Days % config == 0)
                    {
                        //子公司接受“到期未完成”的任务计划提醒
                        //任务计划确实过期，且为提醒频率的整数倍，且任务计划责任人有邮件，则生成提醒邮件。
                        GenerateExpiredButUndoneMail(plan);
                    }
                    else if (plan.ExpiredDT > DateTime.Now
                    && ((TimeSpan)(plan.ExpiredDT - DateTime.Now)).Days < config)
                    {
                        //母公司接受”即将过期“的任务计划提醒
                        //即将过期提醒
                        //任务计划即将在设定的天数内过期
                        GenerateToExpireMail(plan);
                    }
                }
            }
        }

        ///<summary>
        ///母公司接受”即将过期“的任务计划提醒
        ///</summary>
        private void GenerateToExpireMail(Plan plan)
        {
            Enterprise enterprise = plan.EnterpriseCodification.Enterprise;

            List<EnterpriseUser> users = new List<EnterpriseUser>();
            if (enterprise.Parent != null)
            {
                //如果任务计划属于子公司, 该子公司有母公司，则提醒母公司管理员。
                int days = ((TimeSpan)(plan.ExpiredDT - DateTime.Now)).Days;

                users = new EnterpriseUser().GetSpecialList<EnterpriseUser>(null, "where enterpriseID = " + enterprise.Parent.ID.ToString());

                //查看母公司设置，是全部通知，还是仅指派的通知。
                bool shouldAlert = enterprise.Parent.EnterpriseConfig.TaskPlanAlertType == "全部" || plan.Type == (int)TaskPlanType.指派;

                if (users.Count > 0 && shouldAlert)
                {//只有当任务计划有责任人且责任人有mail时，才发送邮件。
                    Email mail = new Email();
                    mail.Subject = plan.Name + " 任务还有" + days + "天到期，请查看";
                    mail.Content = mail.Subject
                        + "\n" + "http://www.dowann.com"
                        + "\n" + string.Format(LDSP.Util.Constants.Info.Mail_Postfix, DateTime.Now.ToShortDateString());
                    mail.PlanSendDate = DateTime.Now;

                    string userMail = string.Empty;
                    foreach (EnterpriseUser u in users)
                    {
                        userMail += u.Email + ";";
                    }

                    mail.Bcc = userMail;

                    if (!string.IsNullOrEmpty(userMail.Trim(',')))
                    {
                        //只有当任务计划有责任人且责任人有mail时，才发送邮件。
                        mail.Add();
                    }
                }
            }
        }

        ///<summary>
        ///子公司接受“到期未完成”的任务计划提醒
        ///</summary>
        private void GenerateExpiredButUndoneMail(Plan plan)
        {
            List<R_PlanPrinciple> users = new R_PlanPrinciple().GetListByPlan(plan.ID);

            if (users.Count > 0)
            {//只有当任务计划有责任人且责任人有mail时，才发送邮件。
                Email mail = new Email();
                mail.Subject = plan.Name + " 任务已到期未完成，请查看";
                mail.Content = mail.Subject + string.Format(LDSP.Util.Constants.Info.Mail_Postfix, DateTime.Now.ToShortDateString());
                mail.PlanSendDate = DateTime.Now;

                string userMail = string.Empty;
                foreach (R_PlanPrinciple u in users)
                {
                    EnterpriseUser user = new EnterpriseUser();
                    user.GetProperties(u.UserID);
                    userMail += user.Email + ";";
                }

                mail.Bcc = userMail;

                if (!string.IsNullOrEmpty(userMail.Trim(';')))
                {//只有当任务计划有责任人且责任人有mail时，才发送邮件。
                    mail.Add();
                }
            }
        }
    }
}
